package com.sugar.subscribe.course.module.business.dal.dataobject.order;

import com.sugar.subscribe.course.framework.mybatis.core.type.StringListTypeHandler;
import lombok.*;

import java.time.*;
import java.util.*;
import java.time.LocalDateTime;
import java.time.LocalDateTime;
import java.time.LocalDateTime;
import java.time.LocalDateTime;
import java.time.LocalDateTime;
import java.time.LocalDateTime;
import java.time.LocalDateTime;
import java.time.LocalDateTime;
import java.time.LocalDateTime;
import com.baomidou.mybatisplus.annotation.*;
import com.sugar.subscribe.course.framework.mybatis.core.dataobject.BaseDO;

/**
 * 订单 DO
 *
 * @author Ysugar
 */
@TableName(value = "business_order", autoResultMap = true)
@KeySequence("business_order_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库，可不写。
@Data
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class OrderDO extends BaseDO {

    // ======================================== 订单基本信息 ========================================
    /**
     * ID
     */
    @TableId
    private Long id;
    /**
     * 用户ID
     */
    private Long userId;
    /**
     * 订单编号
     */
    private String orderNo;
    /**
     * 教练ID
     */
    @TableField(updateStrategy = FieldStrategy.NOT_NULL)
    private Long coachId;

    // ======================================== 课程信息 ========================================
    /**
     * 上课日期
     */
    private LocalDate attendClassDate;
    /**
     * 上课地点ID
     */
    private Long venueId;
    /**
     * 上课地点名称
     */
    private String venueName;
    /**
     * 服务一级分类ID
     */
    private Long servicePId;
    /**
     * 服务一级分类名称
     */
    private String servicePName;
    /**
     * 服务二级分类ID
     */
    private Long serviceId;
    /**
     * 服务二级分类名称
     */
    private String serviceName;
    /**
     * 开始上课时间
     */
    private LocalTime startTime;
    /**
     * 教学人数（字典：business_coach_service_people_count）
     */
    private String peopleCount;
    /**
     * 教学时间（字典：business_coach_service_time）
     */
    private String serviceTime;
    /**
     * 雪板类型（字典：business_snowboard_type）
     */
    private String snowboardType;
    /**
     * 滑行水平（字典：business_gliding_level）
     */
    private String businessGlidingLevel;
    /**
     * 用户昵称
     */
    private String nickname;
    /**
     * 联络手机号
     */
    private String mobile;
    /**
     * 备注
     */
    private String remark;
    /**
     * 是否修改过上课时间：[0否；1是]
     */
    private Boolean updatedAttendClassDate;

    // ======================================== 支付信息 ========================================
    /**
     * 实付金额（单位分）
     */
    private Integer paymentAmount;
    /**
     * 支付状态（0待支付；1已支付）
     */
    private Boolean paymentStatus;
    /**
     * 支付时间
     */
    private LocalDateTime paymentTime;
    /**
     * 支付订单编号
     */
    private Long payOrderId;

    // ======================================== 订单主要信息 ========================================
    /**
     * 下单时间
     */
    private LocalDateTime orderTime;
    /**
     * 接单时间
     */
    private LocalDateTime receivedTime;
    /**
     * 接单时长（单位分钟）
     */
    private Integer receivedMinutes;
    /**
     * 订单完成时间
     */
    private LocalDateTime doneTime;
    /**
     * 取消时间
     */
    private LocalDateTime cancelTime;
    /**
     * 取消类型（0未取消；1系统自动取消；2用户取消；3教练取消）
     */
    private Integer cancelType;
    /**
     * 订单类型（0一键约课；1直选教练约课）类型为 1 的，若教练不接单，则自动取消订单，并退款
     */
    private Boolean orderType;
    /**
     * 订单状态（0待接单；1已取消；2待上课；3待确认；4已完成）
     */
    private Integer status;

    // ======================================== 教练收益信息 ========================================
    /**
     * 预估收益（单位分）根据实付金额计算
     */
    private Integer profitAmount;
    /**
     * 收益是否到账：[0未到账；1已到账]
     */
    private Integer profitArrivalStatus;
    /**
     * 收益预计到账时间
     */
    private LocalDateTime predictProfitArrivalTime;
    /**
     * 收益实际到账时间
     */
    private LocalDateTime profitArrivalTime;
    /**
     * 是否有扣教练违约金：[0否；1是]
     */
    private Boolean isDeductLiquidatedDamages;
    /**
     * 教练违约金（单位分）
     */
    private Integer liquidatedDamages;

    // ======================================== 教练上课信息 ========================================
    /**
     * 教练上课时间
     */
    private LocalDateTime attendClassTime;
    /**
     * 上课图片
     */
    @TableField(typeHandler = StringListTypeHandler.class)
    private List<String> attendClassImages;

    // ======================================== 退款信息 ========================================
    /**
     * 退款状态（0未退款；1退款中；2已到账）
     */
    private Integer refundStatus;
    /**
     * 退款单号
     */
    private String refundOrderNo;
    /**
     * 退款订单编号
     */
    private Long refundOrderId;
    /**
     * 退款金额（单位分）
     */
    private Integer refundAmount;
    /**
     * 退款时间
     */
    private LocalDateTime refundTime;
    /**
     * 退款到账时间
     */
    private LocalDateTime refundArrivalTime;
}
